Technical Q&A QA1193
QuickDraw Text Anti-Aliasing using Quartz 2D


Q: çÏê¨ÇµÇΩÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ QuickDraw ÉeÉLÉXÉgÇà Quartz 2D ÉAÉìÉ`ÉGÉCÉäÉAÉXÇóLå¯Ç…Ç∑ÇÈÇ…ÇÕǫǧÇ∑ÇÍÇŒÇÊÇ¢ÇÃÇ≈ǵÇÂǧǩÅH

A: Mac OS X 10.1.5 Ç©ÇÁÅAÉAÉbÉvÉãÇÕÅAäJî≠é“Ç™ Core Graphics (Quartz 2D) ÇÃÉAÉìÉ`ÉGÉCÉäÉAÉXãZèpÇóòópǵǃ QuickDraw ÉeÉLÉXÉgÇï`âÊÇ≈Ç´ÇÈã@î\Çí«â¡ÇµÇ‹ÇµÇΩÅBDZÇÃã@î\Ç™í«â¡Ç≥ÇÍÇΩÇÃÇÕÅADrawThemeTextBox Ç‹ÇΩÇÕ ATSUI ÇâÓǵǃ UniCode ÇÃÉCÉÅÅ[ÉWÉìÉOÇ…äÆëSÇ…ÇÕà⁄çsÇ≈Ç´Ç»Ç≠ǃLJÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃäOäœÇç°Ç‹Ç≈ǫǮÇËDžǵÇΩÇ¢ÅAÇΔǢǧäJî≠é“ÇéxâáÇ∑ÇÈÇΩÇflÇ≈ǵÇΩÅB

10.1.5 Ç≈ÇÕ SwapQDTextFlags Çà API ñºÇæÇØÇ™égópâ¬î\Ç≈džÇËÅACFM åoóRÇ≈ÇÕÉGÉNÉXÉ|Å[ÉgÇ≥ÇÍÇ‹ÇπÇÒÅBDZÇÃÇΩÇflÅACFM ÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÅAApplication Services ÉtÉåÅ[ÉÄÉèÅ[ÉNÇ≈ SwapQDTextFlags ÉVÉìÉ{ÉãÇå©Ç¬ÇØÇÈÇΩÇflÇ…ÅACore Foundation ÉtÉåÅ[ÉÄÉèÅ[ÉNÇà CFBundleGetFunctionPointerForName ÇégǧïKóvǙdžÇËÇ‹Ç∑ÅBCFM ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ©ÇÁ Mach-O ÉVÉìÉ{ÉãÇíTǵǃåƒÇ—èoÇ∑ï˚ñ@ÇÃè⁄ç◊DžǬǢǃÇÕÅACarbonLib SDK DždžÇÈ CallMachOFramework ÇÃÉTÉìÉvÉãÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB

Mac OS X 10.2 (Jaguar) Ç©ÇÁÇÕÅASwapQDTextFlags ÇΔìØÇ∂ã@î\ÇLJǬêVǵǢ API ñº QDSwapTextFlags Ç™ÉTÉ|Å[ÉgÇ≥ÇÍǃǢNjÇ∑ÅBÇ≥ÇÁÇ… Jaguar ÇÕÅAQDSwapPortTextFlags ÇΔǢǧñºëOÇÃÉ|Å[ÉgÉxÅ[ÉXÇÃêVǵǢ API ÇÉTÉ|Å[ÉgǵǃǢNjÇ∑ÅBDZÇÍÇ…ÇÊÇËäJî≠é“ÇÕÅAÉ|Å[ÉgÇ≤ÇΔÇ…ê›íËÇêßå‰Ç≈Ç´Ç‹Ç∑ÅB



ä÷êî:

// 10.1.5 à»ç~Ç≈ÇÕÅASwapQDTextFlags ÇÕåªç›ÇÃ

// ÉtÉâÉOÇï‘ǵÅAïKóvÇ…âûÇ∂ǃêVǵǢÉtÉâÉOÇê›íËÇ∑ÇÈ

UInt32 SwapQDTextFlags(UInt32 newFlags);

// 10.2 à»ç~Ç≈ÇÕÅAQDSwapTextFlags ÇÕåªç›ÇÃ

// ÉtÉâÉOÇï‘ǵÅAïKóvÇ…âûÇ∂ǃêVǵǢÉtÉâÉOÇê›íËÇ∑ÇÈ

UInt32 QDSwapTextFlags(UInt32 newFlags);

ÉpÉâÉÅÉ^:

UInt32 newFlags;

ÉTÉ|Å[ÉgÇ≥ÇÍÇÈÉtÉâÉO:

// ÉVÉXÉeÉÄÉfÉtÉHÉãÉgÇ≈éwíËÇ≥ÇÍǃǢÇÈLJÇÃÇê›íËÇ∑ÇÈ // âΩLJéwíËÇ≥ÇÍǃǢǻǢèÍçáÇÕÅAåªéûì_Ç≈ÇÕÅA // kQDUseTrueTypeScalerGlyphs Çê›íËÇ∑ÇÈ kQDUseDefaultTextRendering = 0

// ÉrÉbÉg 0 kQDUseTrueTypeScalerGlyphs = (1 << 0)

// ÉrÉbÉg 1 kQDUseCGTextRendering = (1 << 1)

// ÉrÉbÉg 2

// Mac OS X 10.2 Ç≈ÇÕÅAkQDUseCGTextMetrics ÇÕ

// kQDUseCGTextRendering Çà”ñ°Ç∑ÇÈ kQDUseCGTextMetrics = (1 << 2)

kQDSupportedFlags = kQDUseTrueTypeScalerGlyphs | kQDUseCGTextRendering | kQDUseCGTextMetrics

// âΩLJïœçXÇπÇ∏Ç…ÅAåªç›ÇÃèÛë‘ÇóvãÅÇ∑ÇÈ kQDDontChangeFlags = 0xFFFFFFFF

êÑèßÇ≥ÇÍÇÈégópï˚ñ@:

UInt32 savedFlags = SwapQDTextFlags(newFlags);

// ÅgnewFlagsÅhÇÃèÛë‘ÇÃâ∫Ç≈ÉeÉLÉXÉgÇï`âÊÇ∑ÇÈ

// à»ëOÇÃê›íËÇ…ñflÇ∑ (void)SwapQDTextFlags(savedFlags);

É|Å[ÉgÇÉxÅ[ÉXÇΔǵÇΩ API:

// 10.2 à»ç~Ç≈ÇÕÅAQDSwapPortTextFlags ÇÕ

// éwíËÇ≥ÇÍÇΩÉ|Å[ÉgÇÃåªç›ÇÃÉtÉâÉOÇï‘ǵÅA

// ïKóvÇ…âûÇ∂ǃêVǵǢÉtÉâÉOÇê›íËÇ∑ÇÈ

UInt32 QDSwapPortTextFlags(CGrafPtr port, UInt32 newFlags);

ÉpÉâÉÅÉ^:

CGrafPtr port; // džÇÁljÇÈÉOÉçÅ[ÉoÉãê›íËÇ…óDêÊÇ∑ÇÈÉ|Å[ÉgÇ≤ÇΔÇÃê›íË // port == NULL Ç»ÇÁÇŒÅAåªç›ÇÃÉ|Å[ÉgÇ™égópÇ≥ÇÍÇÈ

UInt32 newFlags; // è„ãLÇà SwapQDTextFlags ÇΔ QDSwapTextFlags // Ç≤ÇΔÇ…ÅgnewFlagsÅhÇíËã`



ÉfÉBÉXÉJÉbÉVÉáÉìÅF

ÅiÉäÉtÉçÅ[ÇâÒîÇ∑ÇÈÇΩÇflÇ…Åjä˘ë∂ÇÃÉhÉLÉÖÉÅÉìÉgÇΔÇÃå›ä∑ê´Ç™ïKóvÇ»èÍçáÇ…å¿ÇËÅAkQDUseCGTextMetrics ÇéwíËÇπÇ∏Ç… SwapQDTextFlags(kQDUseCGTextRendering) ÇégǢNjÇ∑ÅBà»ëOÇà QuickdrawText ÇÃÉÅÉgÉäÉbÉNèÓïÒÇÕÅAéwé¶Ç≥ÇÍÇΩÅiÉOÉäÉbÉhÇ…çáÇ¡ÇΩÅjÉAÉEÉgÉâÉCÉìÇ©ÇÁéÊìæÇ≥ÇÍÅACG ÉeÉLÉXÉgÉåÉìÉ_ÉäÉìÉOÇ≈égÇÌÇÍÇÈóùëzìIÇ»ÉAÉEÉgÉâÉCÉìÇ…ëŒâûǵÇΩóùëzìIÇ»ÅiÇΔǢǧDZÇΔÇä¥Ç∂Ç≥ÇπǻǢÅjÉÅÉgÉäÉbÉNÇΔÇÕÇ©ÇØó£ÇÍǃǢÇÈDZÇΔǙdžÇËÇ‹Ç∑ÅB

SwapQDTextFlags ä÷êîé©ëÃÇÕÅAÉpÉtÉHÅ[É}ÉìÉXÇ…èdëÂÇ»âeãøóÕÇó^ǶÇÈLJÇÃÇ≈ÇÕǻǢÇΩÇflÅAÉtÉâÉOÇÕǢǬÇ≈LJïœçXÇ≈Ç´Ç‹Ç∑ÅBê›íËÇÕÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≤ÇΔÅiÇΩÇΔǶnjÅASetFractEnable()ÅASetOutlinePreferred() ǻǫÅjÇ≈džÇËÅAGrafPort Ç≤ÇΔÇ≈ÇÕdžÇËÇ‹ÇπÇÒÅBÉ|Å[ÉgÇ≤ÇΔÇÃê›íËÇ…ÇÕÅAQDSwapPortTextFlags ÇégǢNjÇ∑ÅB

êßå¿éñçÄÅF

SrcOr ÉÇÅ[ÉhÇÕÅAóBàÍÉTÉ|Å[ÉgÇ≥ÇÍǃǢÇÈÉeÉLÉXÉgì]ëóÉÇÅ[ÉhÇ≈Ç∑ÅBǪÇÍà»äOÇÃÉPÅ[ÉXÇ≈ÇÕÅAè]óàÇà QuickDrawText ÉåÉìÉ_ÉäÉìÉOÇégǧDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅBì¡éÍÇ»ì]ëóÉÇÅ[ÉhÇÃå¯â Ç™ïKóvÇ»èÍçáÇÕÅAÉIÉtÉXÉNÉäÅ[ÉìÇ…ÉeÉLÉXÉgÇï`âÊǵǃÅACopyBits ÇégópÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅiDZÇÍÇÕäÓñ{ìIÇ… QuickDrawText LJëºÇÃì]ëóÉÇÅ[ÉhÇ…ëŒÇµçsǡǃǢÇÈDZÇΔÇ≈Ç∑ÅjÅB

ìØólÇ…ÅAÉ{Å[ÉãÉhëÃÇΔÉCÉ^ÉäÉbÉNëÃÇæÇØÇ™ÅAåvéZÇ…ÇÊǡǃê∂ê¨Ç≥ÇÍÇÈéöëÃÇΔǵǃÉTÉ|Å[ÉgÇ≥ÇÍǃǢNjÇ∑ÅiÉ^ÉCÉvÉtÉFÅ[ÉXÇ…å≈óLÇÃÉtÉHÉìÉgǙǻǢèÍçáÅjÅBÇ‹ÇΩÅAÉAÉEÉgÉâÉCÉìÇΔâeÇÕÉTÉ|Å[ÉgÇ≥ÇÍǃǢNjÇπÇÒÅB

ÉAÉìÉ_Å[ÉâÉCÉìÇ™èÌÇ…é¿ê¸Ç≈džÇÈÇÃÇ…ëŒÇµÅAQuickdrawText ÇÕÉfÉBÉZÉìÉ_ÇÃïîï™ÇãÛÇØÇƒÇ®Ç´Ç‹Ç∑ÅB

ìØÇ∂ÉeÉLÉXÉgÇìÒèdÇ…ï`âÊÇ∑ÇÈÇÃÇÕîÇØÇƒÇ≠ÇæÇ≥Ç¢ÅBï`âÊÇåJÇËï‘Ç∑DZÇΔÇ…ÇÊÇËÅAÉAÉìÉ`ÉGÉCÉäÉAÉXÇ≥ÇÍÇΩóÃàÊÇ™à√Ç≠Ç»ÇÈÇΩÇflÇ≈Ç∑ÅB

Cocoa ÉeÉLÉXÉgÇÃèÍçáÇΔìØólÅAîÒèÌÇ…ç◊Ç¢ê¸ÇÃÉtÉHÉìÉgÇÕÅAñæÇÈÇ∑Ǩǃì«Ç›Ç…Ç≠Ç≠Ç»ÇÈDZÇΔǙdžÇËÇ‹Ç∑ÅB

ì¡íËÇÃÉtÉHÉìÉgÇÃÉOÉäÉtÇ…ÇÊǡǃÇÕÅAQD Çà FontInfo Ç…Ç®ÇØÇÈêÇíºï˚å¸ÉÅÉgÉäÉbÉNÇÃÉAÉZÉìÉgÇ‚ÉfÉBÉZÉìÉgÇÃílÇÃå¿ìxÇâzǶǃǢÇÈLJÇÃLJdžÇËÇ‹Ç∑ÅBǪÇÃÇÊǧǻÉOÉäÉtÇ…ëŒÇµÇƒÇÕÅAÇ∑Ç◊ǃÇÃï∂éöǙDZÇÃîÕàÕì‡Ç…é˚Ç‹ÇÈLJÇÃÇΔëzíËǵǃǢÇÈÉeÉLÉXÉgï“èWÉRÅ[ÉhÇ™ÅAïsóvÇ»ÉsÉNÉZÉãÇécǵÇΩÇËÅAÉAÉNÉZÉìÉgÇêÿÇËéÊÇ¡ÇΩÇËÇ∑ÇÈDZÇΔÇÃǻǢÇÊǧDžÅAÉfÉtÉHÉãÉgÇ≈ÇÕÅiSetPreserveGlyph(true) Ç™åƒÇ—èoÇ≥ÇÍǻǢå¿ÇËÅjÅAQuickDrawText Ç™ã≠êßìIÇ…ÉAÉZÉìÉgÇΔÉfÉBÉZÉìÉgÇÃä‘Ç…ÉOÉäÉtÇé˚ÇflÇ‹Ç∑ÅBCG ÉeÉLÉXÉgÉåÉìÉ_ÉäÉìÉOÇÕÅADZÇÃÇÊǧǻÉOÉäÉtÇÅuǬǑÇ∑ÅvèàóùÇÉTÉ|Å[ÉgǵǃǢNjÇπÇÒÅBì¡Ç…ÅAÅuÉZÉfÉBÅ[ÉÜÅvÇ‚ÅAëÂï∂éöÇÃè„Ç…î≠âπãÊï ïÑçÜÇ™ïtÇ≠åæåÍǻǫÇ≈Ç∑ÅBDZÇÍÇâÒîÇ∑ÇÈÇ…ÇÕÅAÅuãUÇËÅvÇÃÉÅÉgÉäÉbÉNèÓïÒÇΔǢǧê›åvè„ÇÃåáä◊ÇéùÇ¡ÇΩÉtÉHÉìÉgÇÃégópÇÕîÇØÇƒÇ≠ÇæÇ≥Ç¢ÅBDZÇÃÇÊǧǻÉtÉHÉìÉgÇÕéÂÇ… TrueType ÉtÉHÉìÉgÇ≈Ç∑ÅBTrueType ÉtÉHÉìÉgÇ…ÇÕÅAìØÇ∂ÉtÉHÉìÉgñºÇéùǬå√Ç¢ÉrÉbÉgÉ}ÉbÉvÉtÉHÉìÉgÇ™ë∂ç›ÇµÇ‹ÇµÇΩÅBTrueType ÉAÉEÉgÉâÉCÉìÇÕÅAä˘ë∂ÇÃÉrÉbÉgÉ}ÉbÉvÉtÉHÉìÉgÇ…Ç≈Ç´ÇÈÇæÇØàÍívÇ≥ÇπÅAÇ‹ÇΩêÇíºï˚å¸ÇÃÉÅÉgÉäÉbÉNÇà€éùÇ∑ÇÈÇÊǧDžÅAÇΔǢǧêßå¿ÇÃâ∫Ç≈ê›åvÇ≥ÇÍNjǵÇΩÇ™ÅADZÇÍÇ…ÇÊÇËì¡íËÇÃí«â¡ÉOÉäÉtÇΔÇÃä‘Ç…ñµèÇÇ™ê∂Ç∂NjǵÇΩÅB

Mac OS X 10.1.5 Ç≈ÇÕÅADZÇÍÇÁÇÃÉtÉâÉOÇÕÅAàÍî ÉVÉXÉeÉÄä¬ã´ê›íËÉpÉlÉãÇÃÉAÉìÉ`ÉGÉCÉäÉAÉXê›íËÇ…ä÷åWÇ»Ç≠ÅA10 É|ÉCÉìÉgà»è„ÇÃÉtÉHÉìÉgÇÃÉeÉLÉXÉgÇëŒè€ÇΔǵÇΩÉAÉìÉ`ÉGÉCÉäÉAÉXÇæÇØÇÉTÉ|Å[ÉgǵNjÇ∑ÅBÇ‹ÇΩÅAMac OS X 10.2 Ç≈ÇÕÅAÉVÉXÉeÉÄä¬ã´ê›íËÇ≈ÇÃê›íËÇ™óDêÊÇ≥ÇÍÇ‹Ç∑ÅB


[2002 îN 10 åé 29 ì˙]